From f5f23c2136a280aa2564ec90c94800452365a7c8 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 14 Apr 2018 11:49:13 +0300 Subject: [PATCH] Associated Rustc with a build config We want to create `rustc` only when we already have workspace, so that we could use the `target` dir to store cached info about the compiler. --- src/bin/cli.rs | 2 +- src/cargo/core/compiler/compilation.rs | 8 ++++++-- .../core/compiler/context/compilation_files.rs | 4 +--- src/cargo/core/compiler/context/mod.rs | 5 +++-- src/cargo/core/compiler/context/target_info.rs | 2 +- src/cargo/core/compiler/custom_build.rs | 2 +- src/cargo/core/compiler/fingerprint.rs | 2 +- src/cargo/core/compiler/mod.rs | 15 +++++++++------ src/cargo/ops/cargo_test.rs | 2 +- src/cargo/util/config.rs | 12 +++++------- 10 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/bin/cli.rs b/src/bin/cli.rs index 548557395..768012a44 100644 --- a/src/bin/cli.rs +++ b/src/bin/cli.rs @@ -47,7 +47,7 @@ Run with 'cargo -Z [FLAG] [SUBCOMMAND]'" } if let Some(ref code) = args.value_of("explain") { - let mut procss = config.rustc()?.process(); + let mut procss = config.new_rustc()?.process(); procss.arg("--explain").arg(code).exec()?; return Ok(()); } diff --git a/src/cargo/core/compiler/compilation.rs b/src/cargo/core/compiler/compilation.rs index b8dcdb5ec..71bddf20f 100644 --- a/src/cargo/core/compiler/compilation.rs +++ b/src/cargo/core/compiler/compilation.rs @@ -57,15 +57,17 @@ pub struct Compilation<'cfg> { /// Flags to pass to rustdoc when invoked from cargo test, per package. pub rustdocflags: HashMap>, + pub host: String, pub target: String, config: &'cfg Config, + rustc_process: ProcessBuilder, target_runner: LazyCell)>>, } impl<'cfg> Compilation<'cfg> { - pub fn new(config: &'cfg Config) -> Compilation<'cfg> { + pub fn new(config: &'cfg Config, rustc_process: ProcessBuilder) -> Compilation<'cfg> { Compilation { libraries: HashMap::new(), native_dirs: BTreeSet::new(), // TODO: deprecated, remove @@ -81,6 +83,8 @@ impl<'cfg> Compilation<'cfg> { cfgs: HashMap::new(), rustdocflags: HashMap::new(), config, + rustc_process, + host: String::new(), target: String::new(), target_runner: LazyCell::new(), } @@ -88,7 +92,7 @@ impl<'cfg> Compilation<'cfg> { /// See `process`. pub fn rustc_process(&self, pkg: &Package) -> CargoResult { - self.fill_env(self.config.rustc()?.process(), pkg, true) + self.fill_env(self.rustc_process.clone(), pkg, true) } /// See `process`. diff --git a/src/cargo/core/compiler/context/compilation_files.rs b/src/cargo/core/compiler/context/compilation_files.rs index da49868c3..88aa1cfc7 100644 --- a/src/cargo/core/compiler/context/compilation_files.rs +++ b/src/cargo/core/compiler/context/compilation_files.rs @@ -434,9 +434,7 @@ fn compute_metadata<'a, 'cfg>( unit.target.name().hash(&mut hasher); unit.target.kind().hash(&mut hasher); - if let Ok(rustc) = cx.config.rustc() { - rustc.verbose_version.hash(&mut hasher); - } + cx.build_config.rustc.verbose_version.hash(&mut hasher); // Seed the contents of __CARGO_DEFAULT_LIB_METADATA to the hasher if present. // This should be the release channel, to get a different hash for each channel. diff --git a/src/cargo/core/compiler/context/mod.rs b/src/cargo/core/compiler/context/mod.rs index e6fab8ed0..f5f279a2d 100644 --- a/src/cargo/core/compiler/context/mod.rs +++ b/src/cargo/core/compiler/context/mod.rs @@ -130,7 +130,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> { let _p = profile::start("Context::probe_target_info"); debug!("probe_target_info"); let host_target_same = match build_config.requested_target { - Some(ref s) if s != &config.rustc()?.host => false, + Some(ref s) if s != &build_config.host_triple => false, _ => true, }; @@ -150,7 +150,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> { config, target_info, host_info, - compilation: Compilation::new(config), + compilation: Compilation::new(config, build_config.rustc.process()), build_state: Arc::new(BuildState::new(&build_config)), build_config, fingerprints: HashMap::new(), @@ -302,6 +302,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> { self.compilation.native_dirs.insert(dir.clone()); } } + self.compilation.host = self.build_config.host_triple.clone(); self.compilation.target = self.build_config.target_triple().to_string(); Ok(self.compilation) } diff --git a/src/cargo/core/compiler/context/target_info.rs b/src/cargo/core/compiler/context/target_info.rs index 40a840103..78a2220ca 100644 --- a/src/cargo/core/compiler/context/target_info.rs +++ b/src/cargo/core/compiler/context/target_info.rs @@ -53,7 +53,7 @@ impl FileType { impl TargetInfo { pub fn new(config: &Config, build_config: &BuildConfig, kind: Kind) -> CargoResult { let rustflags = env_args(config, build_config, None, kind, "RUSTFLAGS")?; - let mut process = config.rustc()?.process(); + let mut process = build_config.rustc.process(); process .arg("-") .arg("--crate-name") diff --git a/src/cargo/core/compiler/custom_build.rs b/src/cargo/core/compiler/custom_build.rs index 3c94e1e00..578e2312c 100644 --- a/src/cargo/core/compiler/custom_build.rs +++ b/src/cargo/core/compiler/custom_build.rs @@ -142,7 +142,7 @@ fn build_work<'a, 'cfg>(cx: &mut Context<'a, 'cfg>, unit: &Unit<'a>) -> CargoRes }, ) .env("HOST", &cx.build_config.host_triple) - .env("RUSTC", &cx.config.rustc()?.path) + .env("RUSTC", &cx.build_config.rustc.path) .env("RUSTDOC", &*cx.config.rustdoc()?) .inherit_jobserver(&cx.jobserver); diff --git a/src/cargo/core/compiler/fingerprint.rs b/src/cargo/core/compiler/fingerprint.rs index 5e734f1ae..8387fd2fd 100644 --- a/src/cargo/core/compiler/fingerprint.rs +++ b/src/cargo/core/compiler/fingerprint.rs @@ -455,7 +455,7 @@ fn calculate<'a, 'cfg>( cx.rustflags_args(unit)? }; let fingerprint = Arc::new(Fingerprint { - rustc: util::hash_u64(&cx.config.rustc()?.verbose_version), + rustc: util::hash_u64(&cx.build_config.rustc.verbose_version), target: util::hash_u64(&unit.target), profile: util::hash_u64(&(&unit.profile, cx.incremental_args(unit)?)), // Note that .0 is hashed here, not .1 which is the cwd. That doesn't diff --git a/src/cargo/core/compiler/mod.rs b/src/cargo/core/compiler/mod.rs index 127e85e92..f626637c7 100644 --- a/src/cargo/core/compiler/mod.rs +++ b/src/cargo/core/compiler/mod.rs @@ -12,11 +12,10 @@ use serde_json; use core::{Feature, PackageId, Profile, Target}; use core::manifest::Lto; use core::shell::ColorChoice; -use util::{self, machine_message, Config, ProcessBuilder}; +use util::{self, machine_message, Config, ProcessBuilder, Rustc, Freshness}; use util::{internal, join_paths, profile}; use util::paths; use util::errors::{CargoResult, CargoResultExt, Internal}; -use util::Freshness; use self::job::{Job, Work}; use self::job_queue::JobQueue; @@ -48,8 +47,8 @@ pub enum Kind { } /// Configuration information for a rustc build. -#[derive(Default, Clone)] pub struct BuildConfig { + pub rustc: Rustc, /// The host arch triple /// /// e.g. x86_64-unknown-linux-gnu, would be @@ -125,20 +124,24 @@ impl BuildConfig { None => None, }; let jobs = jobs.or(cfg_jobs).unwrap_or(::num_cpus::get() as u32); - - let host_triple = config.rustc()?.host.clone(); + let rustc = config.new_rustc()?; + let host_triple = rustc.host.clone(); let host_config = TargetConfig::new(config, &host_triple)?; let target_config = match target.as_ref() { Some(triple) => TargetConfig::new(config, triple)?, None => host_config.clone(), }; Ok(BuildConfig { + rustc, host_triple, requested_target: target, jobs, host: host_config, target: target_config, - ..Default::default() + release: false, + test: false, + doc_all: false, + json_messages: false, }) } diff --git a/src/cargo/ops/cargo_test.rs b/src/cargo/ops/cargo_test.rs index de0bb07b6..c65cc1970 100644 --- a/src/cargo/ops/cargo_test.rs +++ b/src/cargo/ops/cargo_test.rs @@ -150,7 +150,7 @@ fn run_doc_tests( let config = options.compile_opts.config; // We don't build/rust doctests if target != host - if config.rustc()?.host != compilation.target { + if compilation.host != compilation.target { return Ok((Test::Doc, errors)); } diff --git a/src/cargo/util/config.rs b/src/cargo/util/config.rs index 281165ec2..a95c56c7e 100644 --- a/src/cargo/util/config.rs +++ b/src/cargo/util/config.rs @@ -158,13 +158,11 @@ impl Config { } /// Get the path to the `rustc` executable - pub fn rustc(&self) -> CargoResult<&Rustc> { - self.rustc.try_borrow_with(|| { - Rustc::new( - self.get_tool("rustc")?, - self.maybe_get_tool("rustc_wrapper")?, - ) - }) + pub fn new_rustc(&self) -> CargoResult { + Rustc::new( + self.get_tool("rustc")?, + self.maybe_get_tool("rustc_wrapper")?, + ) } /// Get the path to the `cargo` executable -- 2.30.2